//在Flutter中有着两种路由跳转的方式，
// 一种是静态路由，在创建时就已经明确知道了要跳转的页面和值。
// 另一种是动态路由，跳转传入的目标地址和要传入的值都可以是动态的。

//1: 静态路由

//routes: const {}

//routes需要传入类型的Map，第一个参数是目标路由的名称，第二个参数就是你要跳转的页面。
//void main() {
//  runApp(new MaterialApp(
//    home: new MyApp(),
//    routes: <String, WidgetBuilder>{
//      '/page2': (BuildContext context) => new Page2(),
//    },
//  ));
//}
import 'package:flutter/material.dart';
import 'package:flutter_practice/utils/Utils.dart';

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: Utils.getAppBar('页面1'),
      body: RaisedButton(
        onPressed: () {
          //跳转下一个 页面
          Navigator.of(context).pushNamed("/page2");
        },
        child: Text('点击跳转'),
        color: Colors.red,
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  final title;

  Page2(this.title);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: Utils.getAppBar('page2'),
      body: Center(
        child: Text(title),
      ),
    );
  }
}

//2; 动态 路由
//在Navigator中还有一个方法是push（）方法，需要传入一个Route对象，在Flutter中我们可以使用PageRouteBuilder来构建这个Route对象。

class Page3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: Utils.getAppBar('动态路由'),
      body: RaisedButton(
        onPressed: () {
          Navigator.of(context).push(
            PageRouteBuilder(
              pageBuilder: (BuildContext content, Animation<double> ani1,
                  Animation<double> ani2) {
                return Page4(
                  title: '自定义数据',
                );
              },
            ),
          );
        },
        child: Text('动态路由跳转'),
      ),
    );
  }
}

//页面出栈
//在Flutter中我们可以使用Navigator.of(context).pop()进行出栈操作，
// 但是值得注意的时如果页面上有Dialog、BottomSheet、popMenu类似的Widget使用pop（）方法会优先进行这些Widget的关闭操作。
//
//还是上面的代码，我们把第二个页面的Text改成一个按钮，每当点击这个按钮就关闭掉这个页面。
//在前面我们介绍到Navigator.of(context).pop()可以使得页面出栈，当然这个pop方法也是可以传值的，
// 只用Navigator.of(context).pop(attrs)就可以传入自己想要返回的值
class Page4 extends StatelessWidget {
  final title;

  Page4({this.title});

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: Utils.getAppBar('退出'),
      body: Center(
        child: RaisedButton(
          child: Text('退出'),
          onPressed: () {
            Navigator.of(context).pop('page4');
          },
        ),
      ),
    );
  }
}

/// 第一个跳转的页面
class PageFirst extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
//    Navigator.of(context).pushNamed('/PageSecond').then((value) {
//      print('page: one: ');
//      print(value);
//    });

    return Scaffold(
      appBar: Utils.getAppBar('第一个页面'),
      body: Center(
        child: Row(
          children: <Widget>[
            Text('第一个页面'),
            RaisedButton(
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return PageSecond(
                    data: '测试',
                  );
                })).then((value) {
                  print('第一个页面');
                  print(value);
                });
//                Navigator.push<String>(context,
//                    MaterialPageRoute(builder: (BuildContext context) {
//                  return PageSecond(data: '你好');
//                })).then((value) {
//                  print('第一个页面');
//                  print(value);
//                });
              },
              child: Text('跳转'),
            )
          ],
        ),
      ),
    );
  }
}

///第二个页面
class PageSecond extends StatelessWidget {
  final String data;

  PageSecond({this.data});

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    print('page: second ' + data);
    return Center(
      child: RaisedButton(
        onPressed: () {
          Navigator.of(context).pop('第二个页面的返回值'); //不带数据返回
        },
        child: Text('返回'),
      ),
    );
  }
}
